package com.yc.spring.bank;

import com.yc.spring.bank.bean.Account;
import com.yc.spring.bank.bean.Record;
import com.yc.spring.bank.dao.AccountDao;
import com.yc.spring.bank.dao.RecordDao;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

// Transactional
// 1.加在类上, 表示该类被事务管理
// 2. 加在方法上, .....方法....

/**
 * Transactional
 *  .value : 指定事务管理器的 bean.id 默认是 transactionManager
 *  .propagation: 传播特性默认 required
 *  .isolation: 隔离级别默认 default => 使用数据的默认级别
 *  .timeout: 超时设置, 如果在该时间内没有执行完成, 则抛出异常
 *  .readOnly 只读事务, 有性能优势
 *  .rollbackFor 和 rollbackForClassName, 设置回滚异常
 *  .noRollbackFor 和 noRollbackForClassName, 设置不回滚异常
 *
 *  回滚规则: Spring默认只会对出现运行时异常时回滚
 *
 */
@Transactional(
        rollbackFor = BizException.class,
        noRollbackFor = ArithmeticException.class)
@Service
public class BankBiz {
    @Resource
    AccountDao accountDao;
    @Resource
    RecordDao recordDao;

    // 注册
    public void register(Account account) throws BizException {
        // 省略字段验证
        accountDao.insert(account);
        Record record = new Record();
        record.setAid(account.getId());
        record.setOpmoney(account.getBalance());

        int i=1/0;
//        boolean b = true;
//        if(b){
//            // 编译期异常, 默认不回滚
//            throw new BizException("系统异常, 请稍后再试!");
//        }

        recordDao.insert(record);
    }

    // 存款
    public void diposit(String aid, Double money) {
        // 省略字段验证
        accountDao.update(aid, money);
        Record record = new Record();
        record.setAid(aid);
        record.setOpmoney(money);
        recordDao.insert(record);
    }

    // 取款
    public void withdraw(String aid, Double money) throws Exception {
        // 省略字段验证
        Account account = accountDao.selectById(aid);
        System.out.println(account);
        if (account.getBalance() < money) {
            throw new Exception("账号余额不足!");
        }
        diposit(aid, -money);
    }

    // 转账, 先取后存
    public void transfar(String aid1, String aid2, Double money) throws Exception {
        withdraw(aid1, money);
        diposit(aid2, money);
    }









    void a(){
        try{
            // 提交
        }catch (Exception e){
            // 回滚
        }finally {
            // 关闭
        }
    }

    void b(){
        try{
            // 提交
        }catch (Exception e){
            // 回滚
        }finally {
            // 关闭
        }
    }

    void c(){
        try{
            a();
            b();
            // 提交
        }catch (Exception e){
            // 回滚
        }finally {
            // 关闭
        }

    }














}



